#

| Chapter 45 Shell Programming for the Initiated |

## 45.12 Parameter Substitution

The Bourne shell has a handy set of operators for testing and setting shell variables. They're listed in

Table 45.2: Bourne Shell Parameter Substitution Operators
Operator | Explanation
--- | ---
${`var`:-`default`} | If var is not set or is empty, use default instead.
${`var`:=`default`} | If var is not set or is empty, set it to default and use that value.
${`var`:+`instead`} | If var is set and is not empty, use instead. Otherwise, use nothing (null string).
${`var`:?`message`} | If var is set and is not empty, use its value. Otherwise, print message, if any, and exit from the shell. If message is missing, print a default message (which depends on your shell).

If you omit the colon (`:`) from the expressions in Table 45-2, the shell doesn't check for an empty parameter. In other words, the substitution will happen whenever the parameter is set. (That's how some early Bourne shells work: they don't understand a colon in parameter substitution.)

To see how parameter substitution works, here's another version of the bkedit script (44.8, 44.11):

>     #!/bin/sh
>     if cp "$1" "$1.bak"
>     then
>         ${VISUAL:-/usr/ucb/vi} "$1"
>         exit   # USE STATUS FROM EDITOR
>     else
>         echo "`basename $0` quitting: can't make backup?" 1>&2
>         exit 1
>     fi

If the VISUAL (6.3) environment variable is set and is not empty, its value (like /usr/local/bin/emacs) is used and the command line becomes `/usr/local/bin/emacs "$1"`. If VISUAL isn't set, the command line will default to `/usr/ucb/vi "$1"`.

You can use parameter substitution operators in any command line. You'll see them used with the colon (`:`) operator (45.9), checking or setting default values. There's an example below. The first substitution (`${nothing=default}`) will leave `$nothing` empty because the variable has been set. The second substitution will set `$nothing` to default because the variable has been set but is empty. The third substitution will leave `$something` set to stuff:

>     nothing=
>     something=stuff
>     : ${nothing=default}
>     : ${nothing:=default}
>     : ${something:=default}

The Korn shell and bash have similar string editing operators (9.7) like `${``var`##`pattern``}`. They're useful in shell programs, as well as on the command line and in shell setup files.

- JP

45.11 The Multipurpose jot Command |  | 45.13 Save Disk Space and Programming: Multiple Names for a Program